function [ xt, contatore_timestep_xt, stanza_xt, lux, percorso ] = utente( daytime, xt_1, contatore_timestep_xt_1, stanza_xt_1, tabella_transizioni, durate, nstanze, percorso, illuminanza_reale )
%UTENTE Modella il comportamento di un utente
%   In base all'ora del giorno, all'azione svolta e alla tabella delle
%   transizioni
lux_desiderati=[150 600 1000 350 100];

fascia_oraria = map_fascia_oraria(daytime);

if percorso(end) ~= stanza_xt_1 % non ho ancora finito il percorso
    fprintf('[stato=In cammino, stanza corrente=%d, percorso=%s]', stanza_xt_1, int2str(percorso));
    
    percorso=setdiff(percorso,stanza_xt_1);
    xt = xt_1;
    stanza_xt = percorso(1);
    contatore_timestep_xt=contatore_timestep_xt_1;
    lux=0; % illuminanza richiesta nulla, ci deve pensare il sensore
    return;
end

% Con il comando find troviamo le righe della tabella per cui
 % l'azione � quella specificata in xt_1 (quella che l'utente sta
 % compiendo)
 % la fascia oraria � quella specificata in fascia_oraria (quella che contiene
 % l'istante in cui si trova l'utente)
    
%% Estraiamo la porzione di tabella rilevante 
%(N.B. Matlab suggerisce logical indexing invece di find)
sottotabella=tabella_transizioni(tabella_transizioni(:,1)==xt_1 & tabella_transizioni(:,2)==fascia_oraria,:); 

% Determiniamo se sono passati abbastanza timestep per dichiarare conclusa
% un'azione
durata_azione_corrente=durate(xt_1);

if contatore_timestep_xt_1 <= durata_azione_corrente % gli metto <= e non < perch� il contatore dei timestep viene memorizzato gi� aumentato di un'unit� dal contributo
    %dell'utente al timestep precedente, senza <= compio l'azione per un
    %timestep di meno del necessario
   %% Dobbiamo continuare a fare l'azione
    
   logaritmo=log(0:1000)*100; 
   if illuminanza_reale == 0
       lux_percepita = 0;
   else
        lux_percepita=logaritmo(floor(illuminanza_reale));
   end
   
   if ( lux_percepita < lux_desiderati(xt_1))
        lux=lux_desiderati(xt_1);
   else  
        lux=illuminanza_reale;
   end
   xt=xt_1;
   contatore_timestep_xt = contatore_timestep_xt_1+1;
   stanza_xt=stanza_xt_1;
   fprintf('[stato=In attivit�, stanza corrente=%d, percorso=%s, (attivit�,lux)=(%d,%d)]\n', stanza_xt_1, int2str(percorso), xt_1, lux);  
else
    %% Dobbiamo cambiare azione
    probabilita=selezione_a_roulette(sottotabella(:,4));
    % Estraiamo la sottotabella tale che la probabilit� � quella scelta con
    % la selezione a roulette
    sottotabella_prossima_azione=sottotabella(sottotabella(:,4)==probabilita,:);
    
    %% Nel caso in cui vi dovesse essere pi� di una probabilit� uguale, si
    % sceglie casualmente una delle azioni corrispondenti
    numero_righe_sottotabella_prossima_azione = size(sottotabella_prossima_azione,1);
          
    if(numero_righe_sottotabella_prossima_azione > 1)
        indice_riga = round(1+(numero_righe_sottotabella_prossima_azione-1)*rand(1,1));
        sottotabella_prossima_azione=sottotabella_prossima_azione(indice_riga,:);     
    end
    
    xt=sottotabella_prossima_azione(1,3);
    contatore_timestep_xt = 1;
    lux=0; % non lux_desiderati(xt), perch� sta camminando per arrivare alla nuova stanza;
    
    % Ho finito di compiere un'azione: posso pensare di cambiare stanza. Lo
    % faccio con un percorso
    [percorso, stanza_xt]=genera_percorso(nstanze, stanza_xt_1);
    
    fprintf('[stato=Fine attivita, stanza corrente=%d, percorso=%s, (nuova attivit�,nuovi lux)=(%d,%d)]\n', stanza_xt_1, int2str(percorso), xt, lux);

end
end

function fascia_oraria=map_fascia_oraria(daytime)

if daytime >= 6*3600 && daytime <= 8*3600
    fascia_oraria=1;
elseif daytime > 8*3600 && daytime < 10*3600
     fascia_oraria=2;
elseif daytime >= 10*3600 && daytime < 12*3600
     fascia_oraria=3;
elseif daytime >= 12*3600 && daytime < 14*3600
    fascia_oraria=4;
elseif daytime >= 14*3600 && daytime < 16*3600
    fascia_oraria=5;
elseif daytime >= 16*3600 && daytime <= 18*3600
    fascia_oraria=6;
end

end
